package com.up2566.demo.model;

import com.up2566.demo.enums.DataEnum;
import com.up2566.demo.model.dto.ComputeDto;
import java.math.BigDecimal;

/**
 * 模板数据对象
 * 由于灵器存在分为前一分钟模板数据和后四分钟模板数据,减少误差 by up 2021/08/14
 *
 * @author up
 * @date 2021/1/12
 */
public class TemplateModel {

    /**
     * 前一分钟影子次数
     */
    private BigDecimal yzCountA;

    /**
     * 后四分影子次数
     */
    private BigDecimal yzCountB;

    /**
     * 前一分钟踏日次数
     */
    private BigDecimal taCountA;

    /**
     * 后四分钟踏日次数
     */
    private BigDecimal taCountB;

    /**
     * 前一分钟的卷云收益
     * <p>
     * 卷云计算方式较为复杂 包含最终攻击/专精/豪斩值/其他加成
     * 所以此处的技能数不为单纯的技能个数
     * 纯影满豪三段收益约为3.2(包含残云) 依此类推 前一分钟卷云的释放次数+豪斩值收益约为12(模板数据暂用手法) by up 2021/08/14
     */
    private BigDecimal jyCountA;

    /**
     * 后四分钟卷云收益
     */
    private BigDecimal jyCountB;

    /**
     * 前一分钟惊风刃-狂次数
     */
    private BigDecimal leftProCountA;

    /**
     * 后四分钟惊风刃-狂次数
     */
    private BigDecimal leftProCountB;

    /**
     * 前一分钟疾风次数
     */
    private BigDecimal zhuanCountA;

    /**
     * 后四分钟疾风次数
     */
    private BigDecimal zhuanCountB;

    /**
     * 前一分钟贪狼斩次数
     */
    private BigDecimal tlzCountA;

    /**
     * 后四分钟贪狼斩次数
     */
    private BigDecimal tlzCountB;

    /**
     * 豪-前一分钟吃破风+韵灵(会心会伤加成)技能收益
     */
    private BigDecimal jyCountA1;

    /**
     * 豪-前一分钟吃破风技能收益
     */
    private BigDecimal jyCountA2;

    /**
     * 豪-后四分钟吃破风+韵灵(会心会伤加成)技能收益
     */
    private BigDecimal jyCountB1;

    /**
     * 豪-后四分钟吃破风技能收益
     */
    private BigDecimal jyCountB2;


    public static TemplateModel init(ComputeDto dto) {
        switch (dto.getLiupai()) {
            case "0":
                // 纯影
                return initChunYing(dto.getJisu(), dto.getSdse());
            case "1":
                // 云豪
                return initYunHao(dto.getJisu(), dto.getSdse());
            case "2":
                // 纯豪
                return initChunHao(dto.getJisu(), dto.getSdse());
            default:
                // 跳转错误页面
                throw new RuntimeException("流派异常");
        }
    }

    /**
     * 根据急速和韵灵初始化纯影模板数据
     *
     * @param jiSu 急速
     * @param sdse 势断山阿
     */
    private static TemplateModel initChunYing(String jiSu, String sdse) {
        TemplateModel result = initChunYingCount();
        result.initChunYingBySdse(sdse);
        result.initChunYingByJiSu(new BigDecimal(jiSu));
        return result;
    }

    /**
     * 初始化纯影技能数
     */
    private static TemplateModel initChunYingCount() {
        TemplateModel result = new TemplateModel();
        result.yzCountA = new BigDecimal("58");
        result.taCountA = new BigDecimal("13");
        result.jyCountA = new BigDecimal("12");
        result.leftProCountA = new BigDecimal("52");
        result.zhuanCountA = new BigDecimal("24");
        result.tlzCountA = new BigDecimal("2");

        result.yzCountB = new BigDecimal("203");
        result.taCountB = new BigDecimal("72");
        result.jyCountB = new BigDecimal("47");
        result.leftProCountB = new BigDecimal("148");
        result.zhuanCountB = new BigDecimal("101");
        result.tlzCountB = new BigDecimal("9");
        return result;
    }

    /**
     * 如果勾选了势断山阿韵灵,更新纯影技能数
     *
     * @param sdse 势断山阿
     */
    private void initChunYingBySdse(String sdse) {
        if (!"on".equals(sdse)) {
            return;
        }
        yzCountA = yzCountA.add(new BigDecimal("2"));
        taCountA = taCountA.add(new BigDecimal("3"));
        yzCountB = yzCountB.add(new BigDecimal("7"));
        taCountB = taCountB.add(new BigDecimal("11"));
        jyCountB = jyCountB.subtract(new BigDecimal("2"));
    }

    /**
     * 根据急速动态修正纯影技能数
     *
     * @param jiSu 急速
     */
    private void initChunYingByJiSu(BigDecimal jiSu) {
        if (jiSu.compareTo(new BigDecimal("9.6")) >= 0) {
            BigDecimal jisuXz = new BigDecimal("9.6").subtract(jiSu).divide(DataEnum.JS_XZ_B.value(), BigDecimal.ROUND_UP)
                .setScale(0, BigDecimal.ROUND_DOWN);
            yzCountB = yzCountB.subtract(jisuXz);
            taCountB = taCountB.subtract(jisuXz);
            leftProCountB = leftProCountB.add(jisuXz.multiply(new BigDecimal("1")));
            return;
        }
        if (jiSu.compareTo(new BigDecimal("5.7")) < 0) {
            yzCountB = yzCountB.subtract(new BigDecimal("9"));
            taCountB = taCountB.subtract(new BigDecimal("9"));
            jyCountB = jyCountB.add(new BigDecimal("2"));
            leftProCountB = leftProCountB.add(new BigDecimal("16"));
        } else if (jiSu.compareTo(new BigDecimal("8.1")) < 0) {
            yzCountB = yzCountB.subtract(new BigDecimal("8"));
            taCountB = taCountB.subtract(new BigDecimal("8"));
            jyCountB = jyCountB.add(new BigDecimal("1.5"));
            leftProCountB = leftProCountB.add(new BigDecimal("13"));
        } else {
            BigDecimal jisuXz = new BigDecimal("9.6").subtract(jiSu).divide(DataEnum.JS_XZ_A.value(), BigDecimal.ROUND_UP)
                .setScale(0, BigDecimal.ROUND_UP);
            yzCountB = yzCountB.subtract(jisuXz);
            taCountB = taCountB.subtract(jisuXz);
            jyCountB = jyCountB.add(jisuXz.divide(new BigDecimal("3.5"), BigDecimal.ROUND_HALF_UP));
            leftProCountB = leftProCountB.add(jisuXz.multiply(new BigDecimal("2")));
        }
    }

    /**
     * 根据急速和韵灵初始化云豪模板数据
     *
     * @param jiSu 急速
     * @param sdse 势断山阿
     */
    private static TemplateModel initYunHao(String jiSu, String sdse) {
        TemplateModel result = initYunHaoCount();
        result.initHaoBySdse(sdse);
        result.initYunHaoByJiSu(new BigDecimal(jiSu));
        return result;
    }

    /**
     * 初始化云豪技能数
     */
    private static TemplateModel initYunHaoCount() {
        TemplateModel result = new TemplateModel();
        result.yzCountA = new BigDecimal("36");
        result.taCountA = new BigDecimal("19");
        result.leftProCountA = new BigDecimal("47");
        result.tlzCountA = new BigDecimal("3");
        result.jyCountA = new BigDecimal("23");
        result.jyCountA1 = new BigDecimal("12");
        result.jyCountA2 = new BigDecimal("8");

        result.yzCountB = new BigDecimal("98");
        result.taCountB = new BigDecimal("72");
        result.leftProCountB = new BigDecimal("208");
        result.tlzCountB = new BigDecimal("8");
        result.jyCountB = new BigDecimal("76");
        result.jyCountB1 = new BigDecimal("48");
        result.jyCountB2 = new BigDecimal("32");
        return result;
    }

    /**
     * 如果勾选了势断山阿韵灵,更新豪流派技能数
     *
     * @param sdse 势断山阿
     */
    private void initHaoBySdse(String sdse) {
        if (!"on".equals(sdse)) {
            return;
        }
        taCountA = taCountA.add(new BigDecimal("2"));
        taCountB = taCountB.add(new BigDecimal("11"));
        jyCountA = jyCountA.add(new BigDecimal("1.5"));
        jyCountB = jyCountB.add(new BigDecimal("6.5"));
    }

    /**
     * 根据急速动态修正云豪技能数
     *
     * @param jiSu 急速
     */
    private void initYunHaoByJiSu(BigDecimal jiSu) {
        if (jiSu.compareTo(new BigDecimal("12.2")) >= 0) {
            tlzCountB = tlzCountB.add(BigDecimal.ONE);
            yzCountB = yzCountB.add(new BigDecimal("3"));
            taCountB = taCountB.add(jiSu.subtract(new BigDecimal("11")).divide(new BigDecimal("1.6"), BigDecimal.ROUND_HALF_DOWN));
            jyCountB = jyCountB.add(jiSu.subtract(new BigDecimal("11")).divide(new BigDecimal("4"), BigDecimal.ROUND_HALF_UP));
            if (jiSu.compareTo(new BigDecimal("17.5")) >= 0) {
                tlzCountB = tlzCountB.add(BigDecimal.ONE);
                yzCountB = yzCountB.add(new BigDecimal("3"));
            }
            // 第17次了无痕
            if (jiSu.compareTo(new BigDecimal("19")) >= 0) {
                yzCountB = yzCountB.add(new BigDecimal("4"));
            }
            if (jiSu.compareTo(new BigDecimal("22.5")) >= 0) {
                tlzCountB = tlzCountB.add(BigDecimal.ONE);
                yzCountB = yzCountB.add(new BigDecimal("9"));
                jyCountB = jyCountB.subtract(new BigDecimal("3"));
                jyCountB1 = jyCountB1.add(new BigDecimal("3"));
            }
            // 第六次双开 3刀
            if (jiSu.compareTo(new BigDecimal("25")) >= 0) {
                jyCountB = jyCountB.subtract(new BigDecimal("4"));
                yzCountB = yzCountB.add(new BigDecimal("4"));
                jyCountB1 = jyCountB1.add(new BigDecimal("7"));
            }
            if (jiSu.compareTo(new BigDecimal("27")) >= 0) {
                yzCountB = yzCountB.subtract(new BigDecimal("3"));
                jyCountB2 = jyCountB2.add(new BigDecimal("6"));
            }
        } else {
            // 低急速 回气慢 少踏日 少卷云
            BigDecimal jiSuXz = new BigDecimal("12.2").subtract(jiSu).divide(DataEnum.JS_XZ_A.value(), BigDecimal.ROUND_UP)
                .setScale(0, BigDecimal.ROUND_UP);
            taCountB = taCountB.subtract(jiSuXz);
            jyCountB = jyCountB.subtract(jiSuXz.multiply(new BigDecimal("0.5")));
        }
    }

    /**
     * 根据急速和韵灵初始化纯豪模板数据
     *
     * @param jiSu 急速
     * @param sdse 势断山阿
     */
    private static TemplateModel initChunHao(String jiSu, String sdse) {
        TemplateModel result = initChunHaoCount();
        result.initHaoBySdse(sdse);
        result.initChunHaoByJiSu(new BigDecimal(jiSu));
        return result;
    }

    /**
     * 初始化纯豪技能数
     */
    private static TemplateModel initChunHaoCount() {
        TemplateModel result = new TemplateModel();
        result.yzCountA = new BigDecimal("22");
        result.taCountA = new BigDecimal("16");
        result.leftProCountA = new BigDecimal("42");
        result.tlzCountA = new BigDecimal("2");
        result.jyCountA = new BigDecimal("23");
        result.jyCountA1 = new BigDecimal("15");
        result.jyCountA2 = new BigDecimal("15");

        result.yzCountB = new BigDecimal("71");
        result.taCountB = new BigDecimal("61");
        result.leftProCountB = new BigDecimal("184");
        result.tlzCountB = new BigDecimal("9");
        result.jyCountB = new BigDecimal("67");
        result.jyCountB1 = new BigDecimal("63");
        result.jyCountB2 = new BigDecimal("28");
        return result;
    }

    /**
     * 根据急速动态修正纯豪技能数
     *
     * @param jiSu 急速
     */
    private void initChunHaoByJiSu(BigDecimal jiSu) {
        if (jiSu.compareTo(new BigDecimal("12")) >= 0) {
            taCountB = taCountB.add(jiSu.subtract(new BigDecimal("12")).divide(new BigDecimal("1.6"), BigDecimal.ROUND_HALF_DOWN));
            jyCountB = jyCountB.add(jiSu.subtract(new BigDecimal("12")).divide(new BigDecimal("4"), BigDecimal.ROUND_HALF_UP));
            if (jiSu.compareTo(new BigDecimal("17.5")) >= 0) {
                tlzCountB = tlzCountB.add(BigDecimal.ONE);
                yzCountB = yzCountB.add(new BigDecimal("3"));
            }
        } else {
            // 低急速 回气慢 少踏日 少卷云
            BigDecimal jisuXz = new BigDecimal("12").subtract(jiSu).setScale(0, BigDecimal.ROUND_UP);
            BigDecimal multiply = jisuXz.multiply(new BigDecimal("3"));
            if (multiply.compareTo(new BigDecimal("12")) >= 0) {
                multiply = new BigDecimal("12");
                jyCountB2 = jyCountB2.subtract(new BigDecimal("3"));
            }
            jyCountB1 = jyCountB1.subtract(multiply);
            taCountB = taCountB.subtract(jisuXz);
            jyCountB = jyCountB.subtract(jisuXz.multiply(new BigDecimal("0.5")));
        }
    }

    public BigDecimal getYzCountA() {
        return yzCountA;
    }

    public BigDecimal getYzCountB() {
        return yzCountB;
    }

    public BigDecimal getTaCountA() {
        return taCountA;
    }

    public BigDecimal getTaCountB() {
        return taCountB;
    }

    public BigDecimal getJyCountA() {
        return jyCountA;
    }

    public BigDecimal getJyCountB() {
        return jyCountB;
    }

    public BigDecimal getLeftProCountA() {
        return leftProCountA;
    }

    public BigDecimal getLeftProCountB() {
        return leftProCountB;
    }

    public BigDecimal getZhuanCountA() {
        return zhuanCountA;
    }

    public BigDecimal getZhuanCountB() {
        return zhuanCountB;
    }

    public BigDecimal getTlzCountA() {
        return tlzCountA;
    }

    public BigDecimal getTlzCountB() {
        return tlzCountB;
    }

    public BigDecimal getJyCountA1() {
        return jyCountA1;
    }

    public BigDecimal getJyCountA2() {
        return jyCountA2;
    }

    public BigDecimal getJyCountB1() {
        return jyCountB1;
    }

    public BigDecimal getJyCountB2() {
        return jyCountB2;
    }
}
